package helpers;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;

import javax.servlet.ServletContext;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class StringHelper {
    public static String cutString(String description, int count) {
        String[] str = description.split(" ");
        int max = str.length;
        if (max >= count) {
            max = count;
        }
        description = "";
        
        for (int i = 0; i < max; i++) {
            description += str[i] + " ";
        }
        return description;
    }
    
    public static String getAlias(String str) {
        str = StringHelper.replaceVietnamese(str);
        str = StringHelper.replace(str);
        return str;
    }
    
    public static String replace(String str) {
        str = str.replaceAll("[\\W]+", "-");
        str = str.replaceAll("^-", "");
        str = str.replaceAll("-$", "");
        str = str.toLowerCase();
        return str;
    }

    public static String replaceVietnamese(String str) {
		String[] aArray = {"ấ", "ầ", "ẩ", "ẫ", "ậ", "Ấ", "Ầ", "Ẩ", "Ẫ", "Ậ", "ắ", "ằ", "ẳ", "ẵ", "ặ",
				"Ắ", "Ằ", "Ẳ", "Ẵ", "Ặ", "á", "à", "ả", "ã", "ạ", "â", "ă",
				"�?", "À", "Ả", "Ã", "Ạ", "Â", "Ă" };
		String[] eArray = { "ế", "�?", "ể", "ễ", "ệ", "Ế", "Ề", "Ể", "Ễ", "Ệ",
				"é", "è", "ẻ", "ẽ", "ẹ", "ê", "É", "È", "Ẻ", "Ẽ", "Ẹ", "�?" };
		String[] iArray = { "í", "ì", "ỉ", "ĩ", "ị", "�?", "Ì", "Ỉ", "Ĩ", "�?" };
		String[] oArray = { "ố", "ồ", "ổ", "ỗ", "ộ", "�?", "Ồ", "Ổ", "Ô", "Ộ",
				"ớ", "�?", "ở", "ỡ", "ợ", "�?", "Ờ", "�?", "Ỡ", "Ợ", "ó", "ò",
				"�?", "õ", "�?", "ô", "ơ", "Ó", "Ò", "�?", "Õ", "Ọ", "Ô", "Ơ" };
		String[] uArray = { "ứ", "ừ", "ử", "ữ", "ự", "Ứ", "Ừ", "Ử", "Ữ", "Ự",
				"ú", "ù", "ủ", "ũ", "ụ", "ư", "�?", "Ù", "Ủ", "Ũ", "Ụ", "Ư" };
		String[] yArray = { "ý", "ỳ", "ỷ", "ỹ", "ỵ", "�?", "Ỳ", "Ỷ", "Ỹ", "Ỵ" };
		String[] dArray = { "đ", "�?" };
		for (String item : aArray) {
			str = str.replaceAll(item, "a");
		}
		for (String item : eArray) {
			str = str.replaceAll(item, "e");
		}
		for (String item : iArray) {
			str = str.replaceAll(item, "i");
		}
		for (String item : oArray) {
			str = str.replaceAll(item, "o");
		}
		for (String item : uArray) {
			str = str.replaceAll(item, "u");
		}
		for (String item : yArray) {
			str = str.replaceAll(item, "y");
		}
		for (String item : dArray) {
			str = str.replaceAll(item, "d");
		}
		str = str.toLowerCase();
		return str;

	}

    public static String tag(String str) {
        str = str.replaceAll("\\#", "Sharp");
        str = str.replaceAll("\\+", "Plus");
        str = str.replaceAll("[^.\\w]+", "-");
        str = str.replaceAll("^-", "");
        str = str.replaceAll("-$", "");
        str = str.toLowerCase();
        return str;
    }

    public static String remove(String str) {
        str = str.replaceAll("[\'\"]+", "&quot;");
        return str;
    }

    public static boolean StringIsNullOrEmpty(String string) {
        if (string == null || string.equals("")) {
            return true;
        }
        return false;
    }
    
    public static ArrayList<String> findString(String regex, String input) {
        ArrayList<String> result = new ArrayList<String>();
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input); // get a matcher object
         while(m.find()) {
           result.add(input.substring(m.start(), m.end()));
        }
        return result;
    }
    
    public static String html2text(String html) {
        return Jsoup.parse(html).text();
    }
    
    public static String text2UTF8(String str) {
        byte[] utf8bytes = str.getBytes();
        return new String(utf8bytes,Charset.forName("UTF-8"));
    }
    
    public static String arrayToString(String[] a, String separator) {
        if (a == null || separator == null) {
            return null;
        }
        StringBuilder result = new StringBuilder();
        if (a.length > 0) {
            result.append(a[0]);
            for (int i=1; i < a.length; i++) {
                result.append(separator);
                result.append(a[i]);
            }
        }
        return result.toString();
   }
    
  public static String arrayListToString(ArrayList<String> a, String separator) {
      StringBuilder result = new StringBuilder();
      if (a.size() > 0) {
          result.append(a.get(0));
          for (int i = 1; i < a.size(); i++) {
              result.append(separator);
              result.append(a.get(i));
          }
      }
      return result.toString();
  }
  
  public static String listToString(List<String> str, String separator) {
      StringBuilder result = new StringBuilder();
      if (str.size() > 0) {
          result.append(str.get(0));
          for (int i = 1; i < str.size(); i++) {
              result.append(separator);
              result.append(str.get(i));
          }
      }
      return result.toString();
  }
  
  public static String md5(String str) {
	try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(str.getBytes());

        byte byteData[] = md.digest();

        //convert the byte to hex format method 1
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < byteData.length; i++) {
           sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }
        str = sb.toString();
    } catch (Exception e) {}
    return str;
  }
  
  public static String cleanContent(String str) {
		str = str.replaceAll(
				"(class|id)[ ]*[=]{1}[ ]*[\\'\\\"]{1}[^\\'\\\"]+[\\'\\\"]{1}",
				"");
		str = str.replaceAll("<script[^<]+</script[ ]*>", "");
		return str;
  }
  
  public static String getNameFromEmail(String email) {
	  email = email.replaceAll("@[a-z.]+", "");
	  
	  return email;
  }
  
  public static String getHtmlFromUrl(String url) {
		String content="";
		
		try {
			Connection conn = Jsoup.connect(url);
			Document doc = conn
							.header("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
							.header("accept-Language", "en-us,en;q=0.5")
							.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1")
							.get();
			
			content = doc.html();
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return content;
	}
  
  public static String getHtmlFromUrl(String link,String charset){
		String content="";
		
		URL url;
		try {
			url = new URL(link);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		    connection.setInstanceFollowRedirects(true);
		    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.21) Gecko/20110830 AlexaToolbar/alxf-2.14 AlexaToolbar/pXVUnvuf-1.2 Firefox/3.6.21");
			connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
			connection.setRequestProperty("Accept-Language", "en-us,en;q=0.5");
			connection.setRequestProperty("Accept-Charset", "	ISO-8859-1,utf-8;q=0.7,*;q=0.7");
			connection.setRequestProperty("Connection", "keep-alive");
			connection.setRequestProperty("Keep-Alive", "115");
			connection.setRequestProperty("Cookie", "PREF=ID=987bb7a56b1cc7bc:U=691fa246d56f502e:FF=0:TM=1314876638:LM=1314876681:S=yBXzqp_WQq9ykX-j; NID=50=nfNXg7ymSSsfdzMnkEuo7t1GCgIEwcK5xmpFhu1mQWwvNI5nFHLZpRsy_1XnaoKrdj9hnz7za9-M2OIO99phfFSTmXln-xCvqzJaRWHsN0EQKgpmkvgUDTWPVF4I4c9L; SID=DQAAALcAAADhqr-J8Ls3CKhmbRjwTMMP1DjmIvR8qBFxv99saTaFFgoRsVf18W4p_BTocYoxYNMvsvh9sfjMj7KqLyd_s9Y0lwYY_Rrljd7t5IpKBTWWnsv9VSJ_qelH943zV8YIT3uuIdJbHhFlCnVEu_YealZoldWjf4VirYR0PIrr0i4_JU2JCHRmpyW0ACt3KcyLkukJlGDyT5yC5js3CBSTAhnWSylBpMWPWyWJzqXe2BQFcdfuU_qo00pAR-uEcMQ437M; HSID=A9Z-j3CKhzDEykAES");
			connection.setRequestProperty("Cache-Control", "max-age=0");
			BufferedReader reader=null;
			if("gzip".equals(connection.getContentEncoding()))
		    {
				reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), Charset.forName(charset)));
		    } else {
		    	reader= new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName(charset)));
		    }
			char[] buf = new char[102102];
			int numRead=0;
	        while((numRead=reader.read(buf)) != -1){
	            String readData = String.valueOf(buf, 0, numRead);
	            content += readData;
	            buf = new char[102102];
	        }
	        reader.close();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return content;
	}
  
  	public static String replace(String content, TreeMap<String, String> params) {
  		for (Map.Entry<String, String> entry : params.entrySet()) {
  			content = content.replaceAll(entry.getKey(), entry.getValue());
  		}
  		return content;
  	}
  
  	public static String getContentPhp(String pathFile, ServletContext srevletContext) {
		InputStream is = srevletContext.getResourceAsStream(pathFile);
		StringBuffer read = new StringBuffer();
		try {
			InputStreamReader in = new InputStreamReader(is, "utf-8");

			char[] buf = new char[102102];

			int numRead = 0;
			while ((numRead = in.read(buf)) != -1) {
				String readData = String.valueOf(buf, 0, numRead);
				read.append(readData);
				buf = new char[102102];
			}
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return read.toString();
	}
  	
}
